#pragma once

#include <Eigen/Dense>
#include "eigen/hidden_layer.h"

namespace  ldl_eigen
{
class Linear : public HiddenLayer
{
public:
    using HiddenLayer::forward;
    using HiddenLayer::backward;
    Linear(int64_t d, int64_t h);
    virtual ~Linear() = default;

    virtual void forward() override;

    virtual void backward() override;

    /**
     * @brief 更新权重和偏置
     */
    virtual void update() override;

    Eigen::MatrixXf get_weights();
    void set_weights(const Eigen::MatrixXf &weights);

    Eigen::VectorXf get_bias();
    void set_bias(const Eigen::VectorXf &bias);
protected:
    Eigen::MatrixXf m_weights{};
    Eigen::MatrixXf m_weights_gradient{};
    Eigen::VectorXf m_bias{};
    Eigen::MatrixXf m_bias_gradient{};
};
}
